libobs_wrapper\display\window_manager/
show_hide.rs

1#[cfg(windows)]
2use std::sync::atomic::Ordering;
3#[cfg(windows)]
4use windows::Win32::UI::WindowsAndMessaging::{ShowWindow, SW_HIDE, SW_SHOWNA};
5
6use crate::display::window_manager::ShowHideTrait;
7use crate::display::ObsDisplayRef;
8use crate::run_with_obs;
9use crate::utils::ObsError;
10
11impl ShowHideTrait for ObsDisplayRef {
12    /// Shows the window.
13    ///
14    /// # Panics
15    /// if the internal lock is poisoned.
16    fn show(&mut self) -> Result<(), ObsError> {
17        log::trace!("show");
18
19        #[cfg(windows)]
20        if let Some(m) = &self.child_window_handler {
21            let m = m
22                .read()
23                .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
24            unsafe {
25                let _ = ShowWindow(m.window_handle.get_hwnd(), SW_SHOWNA);
26            }
27
28            m.is_hidden.store(false, Ordering::Relaxed);
29            return Ok(());
30        }
31
32        let ptr = self.display.clone();
33        run_with_obs!(self.runtime, (ptr), move || unsafe {
34            libobs::obs_display_set_enabled(ptr, true);
35        })?;
36        Ok(())
37    }
38
39    fn hide(&mut self) -> Result<(), ObsError> {
40        log::trace!("hide");
41        #[cfg(windows)]
42        if let Some(m) = &self.child_window_handler {
43            let m = m
44                .read()
45                .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
46
47            unsafe {
48                let _ = ShowWindow(m.window_handle.get_hwnd(), SW_HIDE);
49            }
50
51            m.is_hidden.store(true, Ordering::Relaxed);
52            return Ok(());
53        }
54
55        let ptr = self.display.clone();
56        run_with_obs!(self.runtime, (ptr), move || unsafe {
57            libobs::obs_display_set_enabled(ptr, false);
58        })?;
59        Ok(())
60    }
61
62    fn is_visible(&self) -> Result<bool, ObsError> {
63        #[cfg(windows)]
64        if let Some(m) = &self.child_window_handler {
65            let m = m
66                .read()
67                .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
68
69            return Ok(!m.is_hidden.load(Ordering::Relaxed));
70        }
71
72        let ptr = self.display.clone();
73        run_with_obs!(self.runtime, (ptr), move || unsafe {
74            let enabled = libobs::obs_display_enabled(ptr);
75            Ok(enabled)
76        })?
77    }
78}